NexusPi Git Node
Commit 1e45e26491adfa8e7e09bbdc1ad7fa0fd9049ca0
Parents : 6baff96
Author : James L <jrl290@gmail.com>
Date : 2026-07-24T14:48:05-04:00
v1.0.46: Fix proof timeouts with extra_link_proof_timeout for LoRa interfaces
- Add Transport::extra_link_proof_timeout() to all proof_timeout calculations
(transport relay, Path A, Path A multi-path, Path B) matching Python
Transport.py:1534-1535. For LoRa at 300bps this adds ~13.3s per hop.
- Add ESTABLISHMENT_TIMEOUT_PER_HOP * hops_to() to initiator link timeout
in Link.cpp, matching Python's two-component establishment timeout.
- Fixes LRPROOF/proof timeouts on slow LoRa interfaces where the round
trip exceeds the previous 6s-per-hop window.
Changes
4 files changed, 24 insertions(+), 6 deletions(-)
Diff
diff --git a/Config.h b/Config.h
index c68e5a8..2aa75a6 100755
--- a/Config.h
+++ b/Config.h
@@ -20,8 +20,8 @@
#define CONFIG_H
#define MAJ_VERS 0x01
- #define MIN_VERS 0x2D
- #define FW_RELEASE_TAG "1.0.45"
+ #define MIN_VERS 0x2E
+ #define FW_RELEASE_TAG "1.0.46"
#define MODE_HOST 0x11
#define MODE_TNC 0x12
diff --git a/lib/microReticulum/src/Link.cpp b/lib/microReticulum/src/Link.cpp
index da4cf92..08efef1 100755
--- a/lib/microReticulum/src/Link.cpp
+++ b/lib/microReticulum/src/Link.cpp
@@ -54,6 +54,7 @@ Link::Link(const Destination& destination /*= {Type::NONE}*/, Callbacks::establi
_object->_initiator = true;
_object->_expected_hops = Transport::hops_to(_object->_destination.hash());
_object->_establishment_timeout = Reticulum::get_instance().get_first_hop_timeout(destination.hash());
+ _object->_establishment_timeout += Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP * std::max((uint8_t)1, _object->_expected_hops);
_object->_prv = Cryptography::X25519PrivateKey::generate();
_object->_sig_prv = Cryptography::Ed25519PrivateKey::generate();
}
diff --git a/lib/microReticulum/src/Transport.cpp b/lib/microReticulum/src/Transport.cpp
index 3ed254b..a6012e7 100755
--- a/lib/microReticulum/src/Transport.cpp
+++ b/lib/microReticulum/src/Transport.cpp
@@ -1881,7 +1881,8 @@ static inline bool is_resource_ctx(uint8_t ctx) {
if (packet.packet_type() == Type::Packet::LINKREQUEST) {
TRACE("Transport::inbound: Packet is next-hop LINKREQUEST");
double now = OS::time();
- double proof_timeout = now + Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP * std::max((uint8_t)1, remaining_hops);
+ double proof_timeout = Transport::extra_link_proof_timeout(packet.receiving_interface())
+ + now + Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP * std::max((uint8_t)1, remaining_hops);
// === MTU Clamping (v1.0.12) ===
// When forwarding a LINKREQUEST through this transport node,
@@ -2059,7 +2060,8 @@ static inline bool is_resource_ctx(uint8_t ctx) {
// Create link_table or reverse_table entry for return path
if (packet.packet_type() == Type::Packet::LINKREQUEST) {
double now = OS::time();
- double proof_timeout = now + Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP
+ double proof_timeout = Transport::extra_link_proof_timeout(packet.receiving_interface())
+ + now + Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP
* std::max((uint8_t)1, remaining_hops);
// === MTU Clamping (v1.0.12) ===
@@ -2157,7 +2159,8 @@ static inline bool is_resource_ctx(uint8_t ctx) {
// Create link_table or reverse_table entry for return traffic
if (packet.packet_type() == Type::Packet::LINKREQUEST) {
double now = OS::time();
- double proof_timeout = now + Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP
+ double proof_timeout = Transport::extra_link_proof_timeout(packet.receiving_interface())
+ + now + Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP
* std::max((uint8_t)1, remaining_hops2);
// === MTU Clamping (v1.0.12) ===
@@ -2643,7 +2646,8 @@ static inline bool is_resource_ctx(uint8_t ctx) {
LinkEntry link_entry(now, packet.destination_hash(), outbound_iface, actual_hops,
packet.receiving_interface(), packet.hops(),
packet.destination_hash(), false,
- now + (Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP * actual_hops));
+ Transport::extra_link_proof_timeout(packet.receiving_interface())
+ + now + (Type::Link::ESTABLISHMENT_TIMEOUT_PER_HOP * actual_hops));
Bytes link_id = Link::link_id_from_lr_packet(packet);
_link_table.erase(link_id);
_link_table.insert({link_id, link_entry});
diff --git a/versions.json b/versions.json
index f68274d..20f9f10 100644
--- a/versions.json
+++ b/versions.json
@@ -1,4 +1,17 @@
[
+ {
+ "tag": "v1.0.46",
+ "name": "v1.0.46 — Proof timeout fix: extra_link_proof_timeout for LoRa interfaces",
+ "stability": "beta",
+ "prerelease": false,
+ "published_at": "2026-07-24T00:00:00Z",
+ "assets": [
+ "rtnode_heltec_v3.bin",
+ "rtnode_heltec_v3_merged.bin",
+ "rtnode_heltec_v4.bin",
+ "rtnode_heltec_v4_merged.bin"
+ ]
+ },
{
"tag": "v1.0.45",
"name": "v1.0.45 \u2014 Path request forwarding on broadcast interfaces, WL seeding fix",
Served by rngit 1.4.2 - Generated in 0.03s